package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import educar.db.DbConnection;
import educar.db.JPA;
import java.util.LinkedList;
import java.util.HashMap;

/**
 * 
 * @author Baldani-Ocejo-Padula
 * 
 * Clase que modela una persona cualquiera en el sistema
 *
 */
public class Persona
{
    private static JPA jpa = new JPA();
    private String apellido;
    private String nombre;
    private String dni;

    private String email;
    private String telPersonal;
    private String pais;
    private String provincia;
    private String ciudad;
    private String direccion;
    private String foto;
    
    /**
     * Constructor de la clase
     * 
     * @param ape apellido de la persona
     * @param nom nombre de la persona
     * @param dniP documento nacional de identidad de la persona
     */
    public Persona(String ape, String nom, String dniP, String email, String telPersonal, String pais, String provincia, String ciudad, String direccion, String foto )
    {
        apellido = ape;
        nombre = nom;
        dni = dniP;
        this.email = email;
        this.telPersonal = telPersonal;
        this.pais = pais;
        this.provincia = provincia;
        this.ciudad = ciudad;
        this.direccion = direccion;
        this.foto = foto;

    }



    public Persona(String id)
    {
    	this.dni = id;
    }



	/**
     * Metodo que devuelve una representacion en cadena de texto de los datos
     * de la persona
     */
    public String toString()
    {
        return apellido + ", " + nombre + " - " + dni ; 
    }

    /**
     * Metodo que guarda una persona en la base de datos
     * 
     * @return verdadero si se pudo crear la persistencia en base de datos del objeto
     * falso en caso contrario
     */
    public boolean save()
    {
        try
        {
            Persona.getPersonaByDni(dni);
            return false;
        }
        catch (personaNotFound e1)
        {
            String[] columns = { "apellido", "nombre", "dniPersona","email","telPersonal","pais","provincia","ciudad","direccion","foto" };

            PreparedStatement stm = jpa.newRecord(DbConnection.bd+".persona", columns);

            try
            {
                stm.setString(1, apellido);
                stm.setString(2, nombre);
                stm.setString(3, dni);
                stm.setString(4, email);
                stm.setString(5, telPersonal);
                stm.setString(6, pais);
                stm.setString(7, provincia);
                stm.setString(8, ciudad);
                stm.setString(9, direccion);
                stm.setString(10, foto);
                
            }
            catch (SQLException e)
            {
                e.printStackTrace();
                return false;
            }

            jpa.create(stm);
            return true;
        }
    }

    /**
     * @param dni dni de la persona que se quiere buscar
     * @return un objeto de tipo persona buscando su informacion en la base de datos
     * 
     * @throws personaNotFound si la persona no existe en el sistema
     */
    public static Persona getPersonaByDni(String dni) throws personaNotFound
    {
        ResultSet rs = null;
        Persona p = null;

        rs = jpa.getByField("persona", "dniPersona", dni);

        try
        {
            if (rs.next())
            {
                p = new Persona(rs.getString(3), rs.getString(2), rs.getString(1),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7),rs.getString(8),rs.getString(9),rs.getString(10));
                System.out.println(rs.getString(10));
            }
            else
            {
                throw new personaNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return p;
    }

    /**
     * 
     * @param nombre nombre de la persona que se esta buscando
     * @return una lista conteniendo a todas las personas con el nombre solicitado
     * @throws personaNotFound si no hay ninguna persona con tal nombre en el sistema
     */
    public static LinkedList<Persona> getPersonaByNombre(String nombre) throws personaNotFound
    {
        ResultSet rs = null;
        LinkedList<Persona> personas = new LinkedList<Persona>();
        rs = jpa.getByField("persona", "nombre", nombre);
        Persona p = null;

        try
        {
            while (rs.next())
            {
                p = new Persona(rs.getString(3), rs.getString(2), rs.getString(1),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7),rs.getString(8),rs.getString(9),rs.getString(10));
                personas.add(p);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return personas;
    }

    /**
     * 
     * @param apellido nombre de la persona que se esta buscando
     * @return una lista conteniendo a todas las personas con el apellido solicitado
     * @throws personaNotFound si no hay ninguna persona con tal apellido en el sistema
     */
    public static LinkedList<Persona> getPersonaByApellido(String apellido) throws personaNotFound
    {
        ResultSet rs = null;
        LinkedList<Persona> personas = new LinkedList<Persona>();
        rs = jpa.getByField("persona", "apellido", apellido);
        Persona p = null;

        try
        {
            while (rs.next())
            {
                p = new Persona(rs.getString(3), rs.getString(2), rs.getString(1),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7),rs.getString(8),rs.getString(9),rs.getString(10));
                personas.add(p);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return personas;
    }

    /**
     * Actualiza en base de datos la informacion de la persona con el estado actual
     * de la instancia
     */
    public void update()
    {
        HashMap<String, String> m = new HashMap<String, String>();
        m.put("nombre", nombre);
        m.put("apellido", apellido);
        jpa.genericUpdate("persona", m, "dniPersona", dni);

    }

    /**
     * 
     * @param apellido el apellido que se desea settear a la persona
     */
    public void setApellido(String apellido)
    {
        this.apellido  =  apellido;
    }

    /**
     * 
     * @return el apellido de la persona
     */
    public String getApellido()
    {
        return this.apellido;
    }

    /**
     * 
     * @param nombre el nombre que se quiere settear a la persona
     */
    public void setNombre(String nombre)
    {
        this.nombre =  nombre;
    }

    /**
     * 
     * @return el nombre de la persona
     */
    public String getNombre()
    {
        return this.nombre;
    }

    /**
     * 
     * @param dni el dni que se quiere settear a la persona
     */
    public void setDni(String dni)
    {
        this.dni =  dni;
    }

    /**
     * 
     * @return el nombre de la persona
     */
    public String getDni()
    {
        return this.dni;
    }
    
    /**
     * 
     * @param email el email que se le quiere settear a la persona
     */
    public void setEmail(String email)
    {
        this.email =  email;
    }

    /**
     * 
     * @return el email de la persona
     */
    public String getEmail()
    {
        return this.email;
    }
    
    /**
     * 
     * @param tel el telefono que se le quiere settear a la persona
     */
    public void setTelPersonal(String tel)
    {
        this.telPersonal=  tel;
    }

    /**
     * 
     * @return el tel de la persona
     */
    public String getTelPersonal()
    {
        return this.telPersonal;
    }
    
    /**
     * 
     * @param pais el pais que se le quiere settear a la persona
     */
    public void setPais(String pais)
    {
        this.pais =  pais;
    }

    /**
     * 
     * @return el pais de la persona
     */
    public String getPais()
    {
        return this.pais;
    }
    
    /**
     * 
     * @param prov la provincia que se le quiere settear a la persona
     */
    public void setProvincia(String prov)
    {
        this.provincia =  prov;
    }

    /**
     * 
     * @return la provincia de la persona
     */
    public String getProvincia()
    {
        return this.provincia;
    }
    
    /**
     * 
     * @param ciudad la ciudad que se le quiere settear a la persona
     */
    public void setCiudad(String ciudad)
    {
        this.ciudad =  ciudad;
    }

    /**
     * 
     * @return la ciudad de la persona
     */
    public String getCiudad()
    {
        return this.ciudad;
    }
    
    /**
     * 
     * @param dir la direccion que se le quiere settear a la persona
     */
    public void setDireccion(String dir)
    {
        this.direccion =  dir;
    }

    /**
     * 
     * @return la direccion de la persona
     */
    public String getDireccion()
    {
        return this.direccion;
    }
    
    /**
     * 
     * @param foto la foto que se le quiere settear a la persona
     */
    public void setFoto(String foto)
    {
        this.foto =  foto;
    }

    /**
     * 
     * @return la foto de la persona
     */
    public String getFoto()
    {
        return this.foto;
    }

    /**
     * Destruye en la base de datos esta persona
     */
    public void destroy()
    {
        jpa.destroy("persona", "dniPersona", this.getDni());
    }

}
